package s10338;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Radosław Wichrowski s10338
 */
public class NumeryIndeksow {

    public final static double ETA = (double) 8 / 9;
    public final static double BETA = (double) 1.0;

    private List<String> listaTestow;

    public static void main(String[] args) {
        if (args.length > 0 && args[0].equals("test")) {
            wygenerujTesty();
            return;
        }
        try {
            NumeryIndeksow zadanie = new NumeryIndeksow();
            zadanie.zaczytajDaneTestowe();
            zadanie.uruchom();
        } catch (Exception ex) {
            Logger.getLogger(NumeryIndeksow.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void uruchom() throws Exception {

        Network siec = new Network();
//        int i = 1;
        for (String listaTestow1 : listaTestow) {
//            System.out.println("\nstart ============================================");
//            System.out.println("\nWiersz wejściowy " + listaTestow1);
            siec.startObliczen(listaTestow1);
            Double wynik = siec.getWarstwa3().getNeuronP1().getWyjscie();
            System.out.print(siec.getNumerIndeksu());
//            System.out.println("Spodziewane wyjscie " + siec.getSpodziewaneWyjscie());
//            System.out.println(" " + wynik);
            System.out.printf(" %.4f\n", wynik);
            siec.wyliczBledy();
//            siec.wyswietlWagi();
            siec.korektaWag();

//            if (siec.getSpodziewaneWyjscieInt() == 0) {
//                System.out.printf(i++ + "|%.4f|\n", wynik);
//            } else {
//                System.out.printf(i++ + "||%.4f\n", wynik);
//            }
//            siec.wyswietlWagi();
//            System.out.println("koniec ===========================================");
        }
//        System.out.println("prawidłowych" + siec.getIlePrawidlowych());
//          for (int j = 0; j < expectedOutputs[p].length; j++) {
//                    double err = Math.pow(output[j] - expectedOutputs[p][j], 2);
//                    error += err;
//                }
//        }
    }

    private void zaczytajDaneTestowe() {
        BufferedReader bufferedReader = null;
        try {
            listaTestow = new ArrayList();
            File file = new File("s10338/matrix.txt");
            bufferedReader = new BufferedReader(new FileReader(file));
            String line = bufferedReader.readLine();
            while (line != null) {
                listaTestow.add(line);
                line = bufferedReader.readLine();
            }
        } catch (Exception ex) {
            Logger.getLogger(NumeryIndeksow.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                Logger.getLogger(NumeryIndeksow.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private static void wygenerujTesty() {
        String linia = "";
        for (int k = 0; k < 1000; k++) {
            if (k % 12 == 0) {
                // prawidłowe
                linia = wygenerujTestyPrawidlowe();
            } else {
                //losowe
                for (int i = 0; i < 5; i++) {
                    for (int j = 0; j < 9; j++) {
                        linia += randInt();
                    }
                    if (i != 4) {
                        linia += ";";
                    }
                }
            }
            System.out.println(linia);

            linia = "";
        }
    }

    private static String wygenerujTestyPrawidlowe() {
        String linia = "";
        int liczba = 0;
        int suma = 0;
        //1
        for (int j = 0; j < 9; j++) {
            liczba = randInt();
            suma += liczba;
            if (suma <= 1) {
                linia += liczba;
            } else {
                linia += "0";
            }
        }
        linia += ";";
        //0
        linia += "000000000;";
        //3
        suma = 0;
        for (int j = 0; j < 9; j++) {
            liczba = randInt();
            suma += liczba;
            if (suma <= 3) {
                linia += liczba;
            } else {
                linia += "0";
            }
        }
        linia += ";";
        //3
        suma = 0;
        for (int j = 0; j < 9; j++) {
            liczba = randInt();
            suma += liczba;
            if (suma <= 3) {
                linia += liczba;
            } else {
                linia += "0";
            }
        }
        linia += ";";
        //8
        suma = 0;
        for (int j = 0; j < 9; j++) {
            if (suma == 0) {
                liczba = randInt();
            }
            if (liczba == 0) {
                linia += liczba;
                suma++;
                liczba = 9;
            } else {
                linia += "1";
            }
        }

        return linia;

    }

    public static int randInt(int min, int max) {

        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;

        return randomNum;
    }

    public static int randInt() {

        Random rand = new Random();
        int randomNum = rand.nextInt((1 - 0) + 1) + 0;
        return randomNum;
    }

}
